# -*- coding: utf-8 -*-
'''
# file name:5、自己动手实现生成器.PY
# author： azj
# datetime： 2022/7/8 14:49 
# ide： PyCharm
'''

''''
需求：
python内置函数中有平方的函数
我们不用使用手动实现平方的函数
传参 传2个 （1，3） 返回：1，,4，,9
'''

# 实现平方函数

# 方法一 使用传统的方法实现 平方  缺点：占内存

new_list = []
for i in [1, 2, 3]:
    print(id(i))
    new_list.append(i * i)

print(new_list)  # [1, 4, 9]

'''
4455951536
4455951568
4455951600
[1, 4, 9]

'''


# 方法二 使用迭代器进行平方的计算
# 使用class类型实现迭代器
class Squares():
    '''
    使用迭代器完成平方的计算
    '''

    def __init__(self, start, stop):
        self.start = int(start)
        self.stop = stop

    def __iter__(self):  # 迭代器返回自己
        return self

    def __next__(self):
        if self.start > self.stop:  # 开始值大于结束值 抛出异常 停止迭代 注意边界值 不能>=
            print('出错了')
            raise StopIteration
        else:
            current = self.start * self.start
            self.start += 1
            return current


if __name__ == '__main__':
    iterator = Squares(1.1, 3)
    for i, value in enumerate(iterator):
        print(i, value)


# 方法三 使用生成器完成平方的计算 实现同样的功能
def squares(start, stop):
    for i in range(start, stop+1):
        yield i * i


if __name__ == '__main__':
    iterator = squares(1, 3)
    for i, value in enumerate(iterator):
        print(id(i))
        print(i, value)

'''
0 1
1 4
2 9

yield 生成器和迭代器 性能一样  使用yield 关键字简化了代码

有了生成器 就不用迭代器  因为生成器简单 一个yield完事
'''


# 方法四 ：使用列表生成器实现平方
# squares2 = ([i*i for i in range(1,4)])  # [1, 4, 9]
squares2 = [(i*i for i in range(1,4))] # [1, 4, 9]
print(squares2) # [<generator object <genexpr> at 0x7f77b807a5e8>]
print(type(squares2)) # <class 'list'>

